home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Leser 15 / Amiga Plus Leser CD 15.iso / Tools / Hardware / BlizKick / Modules / romfixes.ASM < prev    next >
Encoding:
Assembly Source File  |  2002-03-13  |  37.5 KB  |  1,758 lines

  1. ; FILE: Source:modules/romfixes.ASM          REV: 14 --- misc rom bugfixes
  2. ; History
  3. ;  0      Started 10th Dec 1999: got idea from Fixes dir in MMULib.lha
  4. ;  1      12th Dec: console device fix accidently bsr'ed two bytes off
  5. ;         -> strange console update problems & cyberguard hits, fixed
  6. ;  2      Added shell Resident patch. froze 1.19.
  7. ;  3      Fixed ramlib stack patch for V37 rom
  8. ;  4      Added ramlib msgport sigbit patch
  9. ;  5      3rd Jan 2000: Disabled resident patch, it's bugged!
  10. ;  6      7th Jan 2000: Bugfixed resident patch. No longer freezes if
  11. ;         user says `resident c:program' without `ADD' switch.
  12. ;         froze 1.20.
  13. ;  7      11th Sep 2000: Added exec/Alert() enable bugfix.
  14. ;  8      20th Oct 2000: Added graphics/WriteChunkyPixels(),
  15. ;         graphics/WritePixelArray8(), graphics/WritePixelLine8() and
  16. ;         exec/FreePooled() bugfixes. These are also fixed by standard
  17. ;         SetPatch.
  18. ;  9      2nd Nov 2000: No longer fail if exec can't be patched. Don't
  19. ;         ask me why. :-)
  20. ;  10     9th Dec 2000: Added exec/ReleaseSemaphore bugfix.
  21. ;  11     13th Dec 2000: Added 68000/68010 utility/UMult64 bugfix.
  22. ;  12     1st Feb 2001: No longer barf on V44+ console.device.
  23. ;  13     8th Feb 2001: Added A4000/A4000T IDE scsi.device initroutine
  24. ;         bugfix.
  25. ;  14     31th Jul 2001: Added graphics/InitArea() bugfix.
  26. ;
  27.  
  28. ;
  29. ; romfixes patch for BlizKick ("patch" Module)
  30. ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  31. ;
  32. ; This patch fixes some bugs in current rom versions (including V40!)
  33. ;
  34. ; - console.device window resize bug (ever wondered why KingCON shell
  35. ;   having review buffer and menus enabled crashes on window resize?-)
  36. ;   (idea from Thor's util/boot/ConsoleFix.lha)
  37. ; - increase ram disk stack size (idea from Thor's util/boot/PatchRAM.lha)
  38. ; - increase ramlib stack size from 2k to 8k
  39. ; - make ramlib msgport use sigbit SIGBREAKB_CTRL_E instead of SIGB_SINGLE
  40. ;   (idea from Eddy Carroll's SnoopDos source code)
  41. ; - shell Resident command bug, see CyberGuard.notes / 1.11beta3
  42. ; - fix harmless "bug" from exec/Alert() -call. It does 'tst.l (IDNestCnt,a6)'
  43. ;   when it should do 'tst.b (IDNestCnt,a6)'.
  44. ; - graphics/WriteChunkyPixels() bugfix, the function trashed a2/a6 with
  45. ;   Akiko chip.
  46. ; - fix graphics/WritePixelArray8() and graphics/WritePixelLine8() source
  47. ;   trashing bug.
  48. ; - fix exec/ReleaseSemaphore() problem with simultanous pending Procure()
  49. ;   and ObtainSemaphore().
  50. ; - fix 68000/68010 utility/UMult64() swapped d0 and d1 result registers.
  51. ;   (also fixes utility/SMult64())
  52. ; - fix A4000/A4000T IDE scsi.device initroutine peeking random memory.
  53. ; - fix graphics/InitArea() bug, AreaEllipse() crashed if buffer wasn't
  54. ;   explicitly zeroed & maxvectors was limited to 8191.
  55. ;
  56. ; Written by Harry "Piru" Sintonen.
  57. ; This source code is Public Domain.
  58.  
  59.  
  60.     include    "blizkickmodule.i"    ; Some required...
  61.  
  62.     SECTION    PATCH,CODE
  63. _DUMMY_LABEL
  64.     BK_PTC
  65.  
  66. ; Code is run with following incoming parameters:
  67. ;
  68. ; a0=ptr to ROM start (buffer)    eg. $1DE087B8
  69. ; a1=ptr to ROM start (ROM)    eg. $00F80000 (do *not* access!)
  70. ; d0=ROM lenght in bytes    eg. $00080000
  71. ; a2=ptr to _FindResident routine (will search ROM buffer for resident tag):
  72. ;    CALL: jsr (a2)
  73. ;      IN: a0=ptr to ROM, d0=rom len, a1=ptr to resident name
  74. ;     OUT: d0=ptr to resident (buf) or NULL
  75. ; a3=ptr to _InstallModule routine (can be used to plant a "module"):
  76. ;    CALL: jsr (a3)
  77. ;      IN: a0=ptr to ROM, d0=rom len, a1=ptr to module, d6=dosbase
  78. ;     OUT: d0=success
  79. ; a4=ptr to _Printf routine (will dump some silly things (errormsg?) to stdout ;-)
  80. ;    CALL: jsr (a4)
  81. ;      IN: a0=FmtString, a1=Array (may be 0), d6=dosbase
  82. ;     OUT: -
  83. ; d6=dosbase, a6=execbase
  84. ;
  85. ; Code should return:
  86. ;
  87. ; d0=true if succeeded, false if failed.
  88. ; d1-d7/a0-a6 can be trashed. a7 *must* be preserved! ;-)
  89.  
  90.     moveq    #0,d7
  91.  
  92.     cmp.w    #37,($C,a0)        ; requires V37+ rom image
  93.     blo    .exit
  94.  
  95.     lea    (regs,pc),a5
  96.     movem.l    d0/a0-a4,(a5)
  97.  
  98.     lea    (.conname,pc),a1
  99.     movem.l    (regs,pc),d0/a0
  100.     move.l    (findresident,pc),a2
  101.     jsr    (a2)
  102.     lea    (.nocon,pc),a1
  103.     tst.l    d0
  104.     beq    .err
  105.  
  106.     move.l    d0,a2
  107.     cmp.b    #44,(RT_VERSION,a2)    ; check for OS 3.5+ console.device
  108.     bhs    .noconbug
  109.  
  110.     IFGT    0
  111.     move.l    (RT_INIT,a2),a2
  112.     ;test if inside rom bounds?
  113.     move.l    (rom_log,pc),d0
  114.     cmp.l    d0,a2
  115.     blo.b    .nofix
  116.     add.l    (rom_size,pc),d0
  117.     cmp.l    d0,a2
  118.     bhs.b    .nofix
  119.     ; inside rom, so generate ram buffer address
  120.     sub.l    (rom_log,pc),a2        ; -$f80000
  121.     add.l    (rom_phys,pc),a2    ; +buffer
  122. .nofix
  123.     ENDC
  124.  
  125.     lea    (.badcon,pc),a1
  126.     lea    (8192,a2),a2
  127.     move.w    #16384/2,d0
  128. .find    addq.l    #2,a2
  129.     subq.w    #1,d0
  130.     beq    .err
  131.  
  132.     cmp.l    #$2C5F45EE,(a2)
  133.     bne.b    .find
  134.     cmp.l    #$0082614C,(4,a2)
  135.     bne.b    .find
  136.     cmp.l    #$24524A92,(8,a2)
  137.     bne.b    .find
  138.     cmp.l    #$66F841EE,(12,a2)
  139.     bne.b    .find
  140.     cmp.l    #$126E2F0E,(16,a2)
  141.     bne.b    .find
  142.  
  143.     ; patch console.device bug!
  144.  
  145.     lea    (.consoledev,pc),a0
  146.     bsr    .patch
  147. .noconbug
  148.  
  149.  
  150.     lea    (.dosname,pc),a1
  151.     movem.l    (regs,pc),d0/a0
  152.     move.l    (findresident,pc),a2
  153.     jsr    (a2)
  154.     lea    (.nodos,pc),a1
  155.     tst.l    d0
  156.     beq    .err
  157.  
  158.     move.l    d0,a2
  159.     lea    (.badram,pc),a1
  160.     lea    (8192,a2),a2
  161.     move.w    #16384/2,d0
  162. .find2    addq.l    #2,a2
  163.     subq.w    #1,d0
  164.     beq    .err
  165.  
  166.     cmp.l    #$4878FFFF,(a2)        ; pea    (-1).w
  167.     bne.b    .find2
  168.     cmp.l    #$4878000A,(4,a2)    ; pea    (10).w
  169.     bne.b    .find2
  170.     cmp.l    #$487804B0,(8,a2)    ; pea    (1200).w
  171.     bne.b    .find2
  172.     cmp.l    #$7000222B,(12,a2)    ; moveq #0,d0 / move.l (x,a3),d1
  173.     bne.b    .find2
  174.  
  175.     ; patch ram disk stack size!
  176.     move.w    #2048,(10,a2)
  177.  
  178.  
  179.     lea    (.ramlibname,pc),a1
  180.     movem.l    (regs,pc),d0/a0
  181.     move.l    (findresident,pc),a2
  182.     jsr    (a2)
  183.     lea    (.noramlib,pc),a1
  184.     tst.l    d0
  185.     beq    .err
  186.  
  187.     move.l    d0,a3
  188.     move.l    d0,a2
  189.  
  190.     lea    (.badramlib,pc),a1
  191.     move.w    #2048/2,d0
  192. .find3    addq.l    #2,a2
  193.     subq.w    #1,d0
  194.     beq.b    .try_37
  195.  
  196.     cmp.l    #$2608E48B,(a2)
  197.     bne.b    .find3
  198.     cmp.l    #$7808E19C,(4,a2)
  199.     bne.b    .find3
  200.     cmp.l    #$4EAEFF76,(8,a2)
  201.     bne.b    .find3
  202.  
  203.     ; patch ramlib stack size! (v39+)
  204.     move.w    #$7820,(4,a2)
  205.     bra.b    .was_39plus
  206.  
  207.  
  208. .try_37    move.l    a3,a2
  209.     move.w    #2048/2,d0
  210. .find3_37    addq.l    #2,a2
  211.     subq.w    #1,d0
  212.     beq    .err
  213.  
  214.     cmp.l    #$283C0000,(a2)
  215.     bne.b    .find3_37
  216.     cmp.l    #$08004EAE,(4,a2)
  217.     bne.b    .find3_37
  218.     cmp.l    #$FF762C5F,(8,a2)
  219.     bne.b    .find3_37
  220.  
  221.     ; patch ramlib stack size! (v37)
  222.     move.w    #$2000,(4,a2)
  223. .was_39plus
  224.  
  225.     lea    (.badramlib_b,pc),a1
  226.     move.w    #4096/2,d0
  227. .find3b    addq.l    #2,a3
  228.     subq.w    #1,d0
  229.     beq    .err
  230.  
  231.     cmp.l    #$246E0114,(a3)
  232.     bne.b    .find3b
  233.     cmp.w    #$2B4A,(4,a3)
  234.     bne.b    .find3b
  235.     cmp.l    #$3B7C0004,(8,a3)
  236.     bne.b    .find3b
  237.     cmp.l    #$600841ED,(14,a3)
  238.     bne.b    .find3b
  239.  
  240.     ; patch ramlib msgport sigbit
  241.     move.w    #14,(10,a3)        ; SIGBREAKB_CTRL_E
  242.  
  243.  
  244.     lea    (.shellname,pc),a1
  245.     movem.l    (regs,pc),d0/a0
  246.     move.l    (findresident,pc),a2
  247.     jsr    (a2)
  248.     lea    (.noshell,pc),a1
  249.     tst.l    d0
  250.     beq    .err
  251.  
  252.     move.l    d0,a2
  253.     lea    (.badresident,pc),a1
  254.     lea    (8192,a2),a2
  255.     move.w    #12288/2,d0
  256. .find4    addq.l    #2,a2
  257.     subq.w    #1,d0
  258.     beq    .err
  259.  
  260.     cmp.l    #$67164AAD,(a2)
  261.     bne.b    .find4
  262.     cmp.l    #$FFD06624,(4,a2)
  263.     bne.b    .find4
  264.     cmp.l    #$202B0004,(8,a2)
  265.     bne.b    .find4
  266.     cmp.l    #$4A806A08,(12,a2)
  267.     bne.b    .find4
  268.     cmp.l    #$0C80FFFF,(16,a2)
  269.     bne.b    .find4
  270.     cmp.l    #$FC196E14,(20,a2)
  271.     bne.b    .find4
  272.     cmp.l    #$4AADFFD4,(24,a2)
  273.     bne.b    .find4
  274.     cmp.l    #$660000B6,(28,a2)
  275.     bne.b    .find4
  276.     cmp.l    #$0CAB0000,(32,a2)
  277.     bne.b    .find4
  278.     cmp.l    #$00010004,(36,a2)
  279.     bne.b    .find4
  280.  
  281.     ; patch shell resident command
  282.  
  283.     lea    (.shell_resident,pc),a0
  284.     bsr    .patch
  285.  
  286.  
  287.     lea    (.execname,pc),a1
  288.     movem.l    (regs,pc),d0/a0
  289.     move.l    (findresident,pc),a2
  290.     jsr    (a2)
  291.     lea    (.noexec,pc),a1
  292.     tst.l    d0
  293.     beq    .err
  294.  
  295.     move.l    d0,a3
  296.     lea    (.noalert,pc),a1
  297.     lea    (8192,a3),a2
  298.     move.w    #8192/2,d0
  299. .find5    subq.w    #1,d0
  300.     beq.b    .isfixed5
  301.     addq.l    #2,a2
  302.     cmp.l    #$4CDF6303,(4,a2)    'movem.l (sp)+,d0/d1/a0/a1/a5/a6'
  303.     bne.b    .find5
  304.     cmp.l    #$6C0833FC,(8,a2)    'bge.b *+$a / move.w #x,abs'
  305.     bne.b    .find5
  306.     cmp.l    #$41EE0202,(-12,a2)    'lea (LastAlert,a6),a0'
  307.     bne.b    .find5
  308.     cmp.l    #$20C720CD,(-8,a2)    'move.l d7,(a0)+ / move.l a5,(a0)+'
  309.     bne.b    .find5
  310.     cmp.w    #$4EB9,(-4,a2)        'jsr (x).l' (already ok!)
  311.     beq.b    .isfixed5
  312.     cmp.l    #$4AAE0126,(a2)        'tst.l IDNestCnt(a6)'
  313.     bne.b    .find5
  314.  
  315.     ; Fix Alert() enable bug (make it tst.b not tst.l)
  316.     move.w    #$4A2E,(a2)
  317. .isfixed5
  318.  
  319.     cmp.b    #39,(RT_VERSION,a3)    ; requires V39+ exec
  320.     blo    .no_v39exec
  321.  
  322.     lea    (.nofreepooled,pc),a1
  323.     lea    (4096,a3),a2
  324.     move.w    #8192/2,d0
  325. .find6    subq.w    #1,d0
  326.     beq.b    .isfixed6
  327.     ;beq    .err
  328.     addq.l    #2,a2
  329.     cmp.l    #$20290020,(a2)
  330.     bne.b    .find6
  331.     cmp.l    #$D0A90014,(4,a2)
  332.     bne.b    .find6
  333.     cmp.l    #$90A90018,(8,a2)
  334.     bne.b    .find6
  335.     cmp.l    #$67064E75,(12,a2)
  336.     bne.b    .find6
  337.     cmp.l    #$59895189,(16,a2)
  338.     bne.b    .find6
  339.     cmp.l    #$20092059,(20,a2)
  340.     bne.b    .find6
  341.  
  342.     ; Fix FreePooled() bug
  343.     move.w    #$001C,(2,a2)
  344. .isfixed6
  345.  
  346.     lea    (.noreleasesemaphore,pc),a1
  347.     lea    (4096,a3),a2
  348.     move.w    #8192/2,d0
  349. .find9    subq.w    #1,d0
  350.     beq    .isfixed9
  351.     ;beq    .err
  352.     addq.l    #2,a2
  353.     cmp.l    #$234A0014,(a2)
  354.     bne.b    .find9
  355.     cmp.l    #$526A000E,(4,a2)
  356.     bne.b    .find9
  357.     cmp.l    #$4EAEFE86,(8,a2)
  358.     bne.b    .find9
  359.     cmp.l    #$222A0028,(12,a2)
  360.     bne.b    .find9
  361.     cmp.l    #$201367DA,(16,a2)
  362.     bne.b    .find9
  363.     cmp.l    #$224B2640,(20,a2)
  364.     bne.b    .find9
  365.     cmp.l    #$20290008,(24,a2)
  366.     bne.b    .find9
  367.     cmp.l    #$6712B280,(28,a2)
  368.     bne.b    .find9
  369.     cmp.l    #$66EE2069,(32,a2)
  370.     bne.b    .find9
  371.     cmp.l    #$0004208B,(36,a2)
  372.     bne.b    .find9
  373.     cmp.l    #$27480004,(40,a2)
  374.     bne.b    .find9
  375.     cmp.l    #$224160B4,(44,a2)
  376.     bne    .find9
  377.     cmp.l    #$B2A90014,(48,a2)
  378.     bne    .find9
  379.     cmp.l    #$66DA2069,(52,a2)
  380.     bne    .find9
  381.     cmp.l    #$0004208B,(56,a2)
  382.     bne    .find9
  383.     cmp.l    #$27480004,(60,a2)
  384.     bne    .find9
  385.     cmp.l    #$526A000E,(64,a2)
  386.     bne    .find9
  387.     cmp.w    #$60BA,(68,a2)
  388.     bne    .find9
  389.  
  390.     ; Fix ReleaseSemaphore() bug
  391.     move.w    #$60BE,(64,a2)
  392.  
  393. .isfixed9
  394. .no_v39exec
  395.  
  396.     lea    (.gfxname,pc),a1
  397.     movem.l    (regs,pc),d0/a0
  398.     move.l    (findresident,pc),a2
  399.     jsr    (a2)
  400.     lea    (.nogfx,pc),a1
  401.     tst.l    d0
  402.     beq    .err
  403.  
  404.     move.l    d0,a3
  405.     cmp.w    #40,(RT_VERSION,a3)    ; WriteChunkyPixels is V40 only
  406.     bne    .no_v40
  407.  
  408.     move.l    (rom_phys,pc),a0
  409.     cmp.l    #(40<<16)|63,($C,a0)    ; 40.63 doesn't have this bug since the WCP()
  410.     beq    .no_v40            ; function doesn't implement Akiko support.
  411.  
  412.     lea    (.badwcp,pc),a1
  413.     lea    (2048,a3),a2
  414.     move.w    #8192/2,d0
  415. .find7    addq.l    #2,a2
  416.     subq.w    #1,d0
  417.     beq.b    .nowcp            ; ignore possible error
  418.  
  419.     cmp.l    #$2F0E2F0A,(a2)
  420.     bne.b    .find7
  421.     cmp.l    #$2F082248,(4,a2)
  422.     bne.b    .find7
  423.     cmp.l    #$487A0020,(8,a2)
  424.     bne.b    .find7
  425.     cmp.l    #$4FEFFFF8,(12,a2)
  426.     bne.b    .find7
  427.     cmp.l    #$204F48A7,(16,a2)
  428.     bne.b    .find7
  429.     cmp.l    #$F000244F,(20,a2)
  430.     bne.b    .find7
  431.     cmp.l    #$2F042C6E,(24,a2)
  432.     bne.b    .find7
  433.     cmp.l    #$01C84EAE,(28,a2)
  434.     bne.b    .find7
  435.     cmp.l    #$FF284FEF,(32,a2)
  436.     bne.b    .find7
  437.     cmp.l    #$00242C5F,(36,a2)
  438.     bne.b    .find7
  439.     cmp.w    #$4E75,(40,a2)
  440.     bne.b    .find7
  441.  
  442.     ; patch graphics/WriteChunkyPixels()
  443.     lea    (.writechunkypixels,pc),a0
  444.     bsr    .patch
  445.     bra.b    .no_v40
  446. .nowcp    bsr    .print
  447. .no_v40
  448.  
  449.     lea    (.badwpa8,pc),a1
  450.     lea    (2048,a3),a2
  451.     move.w    #16384/2,d0
  452. .find8    addq.l    #2,a2
  453.     subq.w    #1,d0
  454.     beq    .nowpa            ; ignore possible error
  455.  
  456.     cmp.l    #$944048C2,(a2)
  457.     bne.b    .find8
  458.     cmp.l    #$52822802,(4,a2)
  459.     bne.b    .find8
  460.     cmp.l    #$6F342E00,(8+8,a2)
  461.     bne.b    .find8
  462.     cmp.l    #$2A019641,(8+12,a2)
  463.     bne.b    .find8
  464.     cmp.l    #$48C35283,(8+16,a2)
  465.     bne.b    .find8
  466.     cmp.l    #$6F282648,(8+20,a2)
  467.     bne.b    .find8
  468.     cmp.l    #$20072205,(8+32,a2)
  469.     bne.b    .find8
  470.     cmp.l    #$224C4EB9,(8+36,a2)
  471.     bne.b    .find8
  472.     cmp.l    #$48E7FFFC,(8+70,a2)
  473.     bne.b    .find8
  474.     cmp.l    #$26690004,(8+74,a2)
  475.     bne.b    .find8
  476.     cmp.l    #$20024E75,(8+304,a2)    ; v39/v40
  477.     beq.b    .found8
  478.     cmp.l    #$20024E75,(8+310,a2)    ; v37
  479.     bne.b    .find8
  480. .found8
  481.     addq.l    #8,a2
  482.     ; patch graphics/WritePixelArray8() & graphics/WritePixelLine8()
  483.     lea    (.writepixelarray8,pc),a0
  484.     bsr    .patch
  485.     bra.b    .got_wpa
  486. .nowpa    bsr    .print
  487. .got_wpa
  488.  
  489.     lea    (.badinitarea,pc),a1
  490.     lea    (1024,a3),a2
  491.     move.w    #16384/2,d0
  492. .findc    addq.l    #2,a2
  493.     subq.w    #1,d0
  494.     beq.b    .isfixedc
  495.  
  496.     cmp.l    #$21490004,(a2)
  497.     bne.b    .findc
  498.     moveq    #0,d1            ; skip=0
  499.     cmp.l    #$20893140,(4,a2)
  500.     beq.b    .is_v39v40
  501.     cmp.l    #$21490000,(4,a2)    ; v37.x
  502.     bne.b    .findc
  503.     cmp.w    #$3140,(8,a2)        ; v37.x
  504.     bne.b    .findc
  505.     moveq    #2,d1            ; skip=2
  506. .is_v39v40    cmp.l    #$0012E580,8(a2,d1.l)
  507.     bne.b    .findc
  508.     cmp.l    #$D2C02149,12(a2,d1.l)
  509.     bne.b    .findc
  510.     cmp.l    #$000C2149,16(a2,d1.l)
  511.     bne.b    .findc
  512.     cmp.l    #$00084268,20(a2,d1.l)
  513.     bne.b    .findc
  514.     cmp.l    #$00104E75,24(a2,d1.l)
  515.     bne.b    .findc
  516.  
  517.     ; patch graphics/InitArea()
  518.     lea    (.initarea,pc),a0
  519.     bsr    .patch
  520.     bra.b    .got_initarea
  521. .isfixedc    bsr    .print
  522. .got_initarea
  523.  
  524.  
  525.     lea    (.utilname,pc),a1
  526.     movem.l    (regs,pc),d0/a0
  527.     move.l    (findresident,pc),a2
  528.     jsr    (a2)
  529.     lea    (.noutil,pc),a1
  530.     tst.l    d0
  531.     beq    .err
  532.     move.l    d0,a2
  533.  
  534.     cmp.b    #39,(RT_VERSION,a2)    ; requires V39+ utility
  535.     blo    .no_v39util
  536.  
  537.     lea    (.noumult64,pc),a1
  538.     move.w    #8192/2,d0
  539. .finda    subq.w    #1,d0
  540. ;    beq    .err
  541.     beq    .isfixeda
  542.     addq.l    #2,a2
  543.     cmp.l    #$48E73800,(a2)
  544.     bne.b    .finda
  545.     cmp.l    #$2601C6C0,(4,a2)
  546.     bne.b    .finda
  547.     cmp.l    #$24014842,(8,a2)
  548.     bne.b    .finda
  549.     cmp.l    #$4840C4C0,(12,a2)
  550.     bne.b    .finda
  551.     cmp.l    #$48432801,(16,a2)
  552.     bne.b    .finda
  553.     cmp.l    #$C8C0D644,(20,a2)
  554.     bne.b    .finda
  555.     cmp.l    #$42444844,(24,a2)
  556.     bne.b    .finda
  557.     cmp.l    #$D5844840,(28,a2)
  558.     bne.b    .finda
  559.     cmp.l    #$48412801,(32,a2)
  560.     bne.b    .finda
  561.     cmp.l    #$C8C0D644,(36,a2)
  562.     bne.b    .finda
  563.     cmp.l    #$42444844,(40,a2)
  564.     bne.b    .finda
  565.     cmp.l    #$D5844843,(44,a2)
  566.     bne.b    .finda
  567.     cmp.l    #$20022203,(48,a2)
  568.     bne    .finda
  569.     cmp.l    #$4CDF001C,(52,a2)
  570.     bne    .finda
  571.     cmp.w    #$4E75,(56,a2)
  572.     bne    .finda
  573.  
  574.     ; Fix 68000/68010 UMult64() bug
  575.     move.l    #$22022003,(48,a2)
  576. .isfixeda
  577. .no_v39util
  578.  
  579.  
  580.     move.l    (rom_phys,pc),a0
  581.     cmp.l    #(37<<16)|299,($C,a0)    ; pre-37.299 doesn't have scsi.device, and thus no bug
  582.     blo    .no_v37scsi
  583.  
  584.     lea    (.scsiname,pc),a1
  585.     movem.l    (regs,pc),d0/a0
  586.     move.l    (findresident,pc),a2
  587.     jsr    (a2)
  588.     lea    (.noscsi,pc),a1
  589.     tst.l    d0
  590.     beq    .err
  591.     move.l    d0,a3
  592.  
  593.     cmp.b    #37,(RT_VERSION,a3)    ; scsidisk 37+
  594.     blo    .no_v37scsi
  595.  
  596.     lea    (.noscsiinit,pc),a1
  597.     move.l    a3,a2
  598.     moveq    #254/2,d0
  599. .findb1    subq.w    #1,d0
  600. ;debug!    beq    .err
  601.     beq    .isfixedb
  602.     addq.l    #2,a2
  603.     cmp.l    #$48E73F3C,(a2)
  604.     bne.b    .findb1
  605.     cmp.l    #$93C94EAE,(4,a2)
  606.     bne.b    .findb1
  607.     cmp.l    #$FEDA2A00,(8,a2)
  608.     bne.b    .findb1
  609.     cmp.l    #$70064EAE,(12,a2)
  610.     bne.b    .findb1
  611.     cmp.l    #$FCD64A80,(16,a2)
  612.     bne.b    .findb1
  613.     cmp.l    #$660E2E3C,(20,a2)
  614.     bne.b    .findb1
  615.     cmp.l    #$14030000,(24,a2)
  616.     bne.b    .findb1
  617.     cmp.l    #$4EAEFF94,(28,a2)
  618.     bne.b    .findb1
  619.     cmp.w    #$6000,(32,a2)
  620.     bne.b    .findb1
  621.     cmp.l    #$7C0049F9,(36,a2)
  622.     bne.b    .findb1
  623.     cmp.l    #$00DD2020,(40,a2)
  624.     bne.b    .findb1
  625.     cmp.l    #$2F007000,(44,a2)
  626.     bne.b    .findb1
  627.     cmp.w    #$6100,(48,a2)
  628.     bne    .findb1
  629.     cmp.l    #$2200201F,(52,a2)
  630.     bne    .findb1
  631.     cmp.l    #$4A816700,(56,a2)
  632.     bne    .findb1
  633.     cmp.w    #$2C40,(62,a2)
  634.     bne    .findb1
  635.  
  636.     ; find 'battmem.resource' string
  637.     move.w    #10240/2,d0
  638.     moveq    #2,d2
  639. .findb2    subq.w    #1,d0
  640. ;debug!    beq    .err
  641.     beq    .isfixedb
  642.     addq.l    #2,d2
  643.     cmp.l    #'batt',16+0(a2,d2.l)        ; 16 is offset to 'lea (battmemname,pc),a1'
  644.     bne.b    .findb2
  645.     cmp.l    #'mem.',16+4(a2,d2.l)
  646.     bne.b    .findb2
  647.     cmp.l    #'reso',16+8(a2,d2.l)
  648.     bne.b    .findb2
  649. .errb2
  650.     ; find read_battmem routine
  651.     move.w    #10240/2,d0
  652.     moveq    #2,d1
  653. .findb3    subq.w    #1,d0
  654. ;debug!    beq    .err
  655.     beq    .isfixedb
  656.     addq.l    #2,d1
  657.     cmp.l    #$41ED0042,32+0(a2,d1.l)    ; 32 is offset the 'bsr.w read_battmem'
  658.     bne.b    .findb3
  659.     cmp.l    #$70017201,32+4(a2,d1.l)
  660.     bne.b    .findb3
  661.     cmp.l    #$4EAEFFEE,32+8(a2,d1.l)
  662.     bne.b    .findb3
  663.     cmp.l    #$2C554E75,32+12(a2,d1.l)
  664.     bne.b    .findb3
  665.  
  666.     move.w    (32+2,a2),d3            ; .exitnull offset
  667.     move.w    (48+2,a2),d4            ; scsi_probescsi offset
  668.     add.w    #32-50,d3            ; adjust for the patch
  669.     add.w    #48-42,d4
  670.  
  671.     ; Patch A4000 scsi.device init bug
  672.  
  673.     move.l    a2,a3
  674.     lea    (.a4000scsidev,pc),a0
  675.     bsr    .patch
  676.     move.w    d2,(16,a3)            ; fix battmemname lea offset (ok!)
  677.     move.w    d1,(32,a3)            ; fix read_battmem bsr.w offset (ok!)
  678.     move.w    d3,(50+2,a3)            ; fix .exitnull beq.w offset
  679.     move.w    d4,(42+2,a3)            ; fix scsi_probescsi bsr.w offset (ok!)
  680. .isfixedb
  681. .no_v37scsi
  682.  
  683.  
  684.  
  685.     moveq    #1,d7
  686.  
  687. .err    tst.l    d7
  688.     bne.b    .exit
  689. .print    lea    (.errh,pc),a0
  690.     move.l    a1,-(sp)
  691.     move.l    sp,a1
  692.     move.l    (printf,pc),a2
  693.     jsr    (a2)
  694.     addq.l    #4,sp
  695. .exit    move.l    d7,d0
  696.     rts
  697.  
  698.  
  699.  
  700. .patch    move.w    (a0)+,d0
  701. .copy    move.w    (a0)+,(a2)+
  702.     subq.w    #1,d0
  703.     bne.b    .copy
  704.     rts
  705.  
  706.  
  707. PATCH    MACRO
  708. .\1    dc.w    (.\1_END-*-2)>>1
  709.     ENDM
  710.  
  711.     PATCH    consoledev
  712.     dc.l    $2C5745EE
  713.     dc.l    $00826002
  714.     dc.l    $614A2452
  715.     dc.l    $4A9266F8
  716.     dc.l    $41EE126E
  717. .consoledev_END
  718.  
  719.     PATCH    shell_resident
  720.     dc.l    $671C4AAD
  721.     dc.l    $FFD06624
  722.     dc.l    $200B6720
  723.     dc.l    $202B0004
  724.     dc.l    $6A0C0C80
  725.     dc.l    $FFFFFC19
  726.     dc.l    $6E126002
  727.     dc.l    $C0DE4AAD
  728.     dc.l    $FFD46600
  729.     dc.l    $00B05380
  730. .shell_resident_END
  731.  
  732. .    PATCH    writechunkypixels
  733.     dc.l    $48E700A2
  734.     dc.l    $2248487A
  735.     dc.l    $0022518F
  736.     dc.l    $204F48A7
  737.     dc.l    $F000244F
  738.     dc.l    $2F042C6E
  739.     dc.l    $01C84EAE
  740.     dc.l    $FF284FEF
  741.     dc.l    $001C4CDF
  742.     dc.l    $4400588F
  743. .writechunkypixels_END
  744.  
  745.     PATCH    writepixelarray8
  746.     dc.l    $D87C000F
  747.     dc.l    $7CFFC87C
  748.     dc.l    $FFF06F2A
  749.     dc.l    $2E002A01
  750.     dc.l    $964148C3
  751.     dc.l    $52836F1E
  752.     dc.l    $7C002648
  753.     dc.l    $2849204B
  754.     dc.l    $20072205
  755.     dc.l    $224C6122
  756.     dc.l    $5285D5C4
  757.     dc.l    $DC805383
  758.     dc.l    $66EC4EAE
  759.     dc.l    $FF1C2006
  760.     dc.l    $4CDF1CFC
  761.     dc.w    $4E75
  762.  
  763.     dc.l    $4E714E71
  764.     dc.l    $4E714E71
  765.  
  766.     dc.l    $2F2EFF1E
  767.  
  768.     dc.w    $48E7
  769.     dc.l    $FFFC48C2
  770.     dc.l    $D47C000F
  771.     dc.l    $C47CFFF0
  772.     dc.l    $72102802
  773.     dc.l    $4EAEFF1C
  774.  
  775.     dc.l    $206F0024
  776.     dc.l    $26042068
  777.     dc.l    $00049682
  778.     dc.l    $10280005
  779.     dc.l    $47F23800
  780.     dc.l    $5088E68B
  781.     dc.l    $4CDB30C0
  782.  
  783.     dc.l    $22587A00
  784.     dc.l    $D3C31A23
  785.     dc.l    $E29D1685
  786.     dc.l    $1A23E29D
  787.     dc.l    $16851A23
  788.     dc.l    $E29D1685
  789.     dc.l    $1A23E29D
  790.     dc.l    $16851A23
  791.     dc.l    $E29D1685
  792.     dc.l    $1A23E29D
  793.     dc.l    $16851A23
  794.     dc.l    $E29D1685
  795.     dc.l    $1A23E29D
  796.     dc.l    $16851A23
  797.     dc.l    $E29D1685
  798.     dc.l    $1A23E29D
  799.     dc.l    $16851A23
  800.     dc.l    $E29D1685
  801.     dc.l    $1A23E29D
  802.     dc.l    $16851A23
  803.     dc.l    $E29D1685
  804.     dc.l    $1A23E29D
  805.     dc.l    $16851A23
  806.     dc.l    $E29D1685
  807.     dc.l    $1A23E29D
  808.     dc.l    $1685E3BD
  809.     dc.l    $D7C132C5
  810.     dc.l    $53006690
  811.  
  812.     dc.l    $48EB30C0
  813.     dc.l    $FFF09481
  814.     dc.l    $6E00FF6A
  815.  
  816.     dc.l    $700041EF
  817.     dc.l    $00207200
  818.     dc.l    $4CD7001C
  819.     dc.l    $22587A01
  820.     dc.l    $7CC02050
  821.     dc.l    $4EAEFDD8
  822.     dc.l    $4CDF3FFF
  823.     dc.l    $20024E75
  824. .writepixelarray8_END
  825.  
  826.     PATCH    initarea
  827.     dc.l    $20C9C0FC
  828.     dc.l    $000420C9
  829.     dc.l    $D3C0E488
  830.     dc.l    $20C920C9
  831.     dc.l    $20806002
  832.     dc.l    $421951C8
  833.     dc.l    $FFFC4E75
  834. .initarea_END
  835.  
  836.     PATCH    a4000scsidev
  837.     dc.w    $48E7,$3F3C
  838.     dc.w    $7C00
  839.  
  840.     dc.w    $42A7
  841.     dc.w    $4FEF,$FFC0
  842.     dc.w    $2A4F
  843.  
  844.     dc.w    $43FA,$0000
  845.     dc.w    $4EAE,$FE0E
  846.     dc.w    $4A80
  847.     dc.w    $6708
  848.     dc.w    $2A8E
  849.     dc.w    $2C40
  850.     dc.w    $6100,$0000
  851.  
  852.     dc.w    $49F9,$00DD,$2020
  853.     dc.w    $7000
  854.     dc.w    $6100,$0000
  855.     dc.w    $4FEF,$0044
  856. ;;    dc.w    $4A80
  857.     dc.w    $6700,$0000
  858.  
  859.     dc.w    $2A2E,$0114
  860.  
  861.     dc.w    $7006
  862.     dc.w    $4EAE,$FCD6
  863.  
  864.     dc.w    $2C40
  865.     dc.w    $4EAE,$FFD0
  866.     dc.w    $2C78,$0004
  867. .a4000scsidev_END
  868.  
  869.  
  870. .errh    dc.b    'romfixes: couldn''t %s!',10,0
  871.  
  872. .nocon    dc.b    'find '
  873. .conname    dc.b    'console.device',0
  874. .badcon    dc.b    'patch console.device bug',0
  875.  
  876. .nodos    dc.b    'find '
  877. .dosname    dc.b    'dos.library',0
  878. .badram    dc.b    'patch ram disk stack size',0
  879.  
  880. .noramlib    dc.b    'find '
  881. .ramlibname    dc.b    'ramlib',0
  882. .badramlib    dc.b    'patch ramlib stack size',0
  883. .badramlib_b    dc.b    'patch ramlib msgport sigbit',0
  884.  
  885. .noshell    dc.b    'find '
  886. .shellname    dc.b    'shell',0
  887. .badresident    dc.b    'patch Resident bug',0
  888.  
  889. .noexec    dc.b    'find '
  890. .execname    dc.b    'exec.library',0
  891. .noalert    dc.b    'patch exec/Alert() bug',0
  892. .nofreepooled    dc.b    'patch exec/FreePooled() bug',0
  893. .noreleasesemaphore
  894.     dc.b    'patch exec/ReleaseSemaphore() bug',0
  895.  
  896. .nogfx    dc.b    'find '
  897. .gfxname    dc.b    'graphics.library',0
  898. .badwcp    dc.b    'patch graphics/WriteChunkyPixels() bug',0
  899. .badwpa8    dc.b    'patch graphics/WritePixelArray8() & WritePixelLine8() bug',0
  900. .badinitarea    dc.b    'patch graphics/InitArea() bug',0
  901.  
  902. .noutil    dc.b    'find '
  903. .utilname    dc.b    'utility.library',0
  904. .noumult64    dc.b    'patch utility/UMult64() bug',0
  905.  
  906. .noscsi    dc.b    'find '
  907. .scsiname    dc.b    'scsi.device',0
  908. .noscsiinit    dc.b    'patch A4000 scsi.device init bug',0
  909.  
  910.     CNOP    0,2
  911. regs
  912. rom_size    ds.l    1
  913. rom_phys    ds.l    1
  914. rom_log    ds.l    1
  915. findresident    ds.l    1
  916. installmodule    ds.l    1
  917. printf    ds.l    1
  918.  
  919.     SECTION    VERSION,DATA
  920.  
  921.     dc.b    '$VER: romfixes_PATCH 1.8 (26.10.01)',0
  922.  
  923.  
  924.     IFGT    0
  925.  
  926.     ; shell/Resident bug
  927.     ; ------------------
  928.  
  929.  
  930.     ; fixed, 2nd try
  931.  
  932. .no_REM    move.l    a2,d0            ;200A
  933.  
  934.     beq.b    .no_filepart        ;671C
  935.     tst.l    (-$0030,a5)        ;4AADFFD0
  936.     bne.b    .is_ADD            ;6624
  937.     move.l    a3,d0            ;200B
  938.     beq.b    .is_ADD            ;6720
  939.     move.l    (4,a3),d0        ;202B0004
  940.     bpl.b    .no_filepart        ;6A0C
  941.     cmp.l    #-999,d0        ;0C80FFFFFC19
  942.     bgt.b    .is_ADD            ;6E12
  943.     bra.b    .no_filepart        ;6002
  944.     dc.w    $C0DE            ;C0DE
  945. .no_filepart    tst.l    (-$002C,a5)        ;4AADFFD4    REPLACE/S
  946.     bne.w    .da_err            ;660000B0
  947.     subq.l    #1,d0            ;5380
  948.  
  949.     ble.w    .da_err            ;6F0000AA
  950. .is_ADD    move.l    (-$0028,a5),d0        ;202DFFD8    PURE/S
  951.  
  952.  
  953.  
  954.     ; rom 39.106:
  955.  
  956. .no_REM    move.l    a2,d0            ;200A
  957.  
  958.     beq.b    .no_filepart        ;6716
  959.     tst.l    (-$0030,a5)        ;4AADFFD0
  960.     bne.b    .is_ADD            ;6624
  961.     move.l    (4,a3),d0        ;202B0004    ;BUG! should test if a3=0 before!
  962.     tst.l    d0            ;4A80
  963.     bpl.b    .no_filepart        ;6A08
  964.     cmp.l    #-999,d0        ;0C80FFFFFC19
  965.     bgt.b    .is_ADD            ;6E14
  966. .no_filepart    tst.l    (-$002C,a5)        ;4AADFFD4    ;REPLACE/S
  967.     bne.w    .da_err            ;660000B6
  968.     cmp.l    #1,(4,a3)        ;0CAB000000010004
  969.  
  970.     ble.w    .da_err            ;6F0000AA
  971. .is_ADD    move.l    (-$0028,a5),d0        ;202DFFD8    ;PURE/S
  972.  
  973.  
  974.  
  975.     ; console.device bug
  976.     ; ------------------
  977.  
  978.     ; fixed
  979.  
  980.     move.l    d7,-(sp)            ;2F07
  981.     lea    ($126E,a6),a0            ;41EE126E
  982.     move.l    a6,-(sp)            ;2F0E
  983.     move.l    ($0030,a6),a6            ;2C6E0030
  984.     jsr    (_LVOObtainSemaphore,a6)    ;4EAEFDCC
  985.  
  986.     move.l    (sp),a6                ;2C57
  987.     lea    ($0082,a6),a2            ;45EE0082
  988.     bra.b    .in                ;6002
  989. .loop    bsr.b    cd_processwindow        ;614A
  990. .in    move.l    (a2),a2                ;2452
  991.     tst.l    (a2)                ;4A92
  992.     bne.b    .loop                ;66F8
  993.     lea    ($126E,a6),a0            ;41EE126E
  994.  
  995.     move.l    ($0030,a6),a6            ;2C6E0030
  996.     jsr    (_LVOReleaseSemaphore,a6)    ;4EAEFDC6
  997.     move.l    (sp)+,a6            ;2C5F
  998.     move.l    (sp)+,d7            ;2E1F
  999.  
  1000.  
  1001.     ; rom 37.300:
  1002.  
  1003.     move.l    d7,-(sp)            ;2F07    ;start here:
  1004.     lea    ($126E,a6),a0            ;41EE126E
  1005.     move.l    a6,-(sp)            ;2F0E
  1006.     move.l    ($0030,a6),a6            ;2C6E0030
  1007.     jsr    (_LVOObtainSemaphore,a6)    ;4EAEFDCC
  1008.  
  1009.     move.l    (sp)+,a6            ;2C5F
  1010.     lea    ($0082,a6),a2            ;45EE0082    ;BUG: the console.device bug
  1011. .loop    bsr.b    cd_processwindow        ;614C
  1012.     move.l    (a2),a2                ;2452
  1013.     tst.l    (a2)                ;4A92
  1014.     bne.b    .loop                ;66F8
  1015.     lea    ($126E,a6),a0            ;41EE126E
  1016.     move.l    a6,-(sp)            ;2F0E
  1017.  
  1018.     move.l    ($0030,a6),a6            ;2C6E0030
  1019.     jsr    (_LVOReleaseSemaphore,a6)    ;4EAEFDC6
  1020.     move.l    (sp)+,a6            ;2C5F
  1021.     move.l    (sp)+,d7            ;2E1F
  1022.  
  1023.  
  1024.     ; rom 40.68:
  1025.  
  1026.     move.l    d7,-(sp)            ;2F07
  1027.     lea    ($126E,a6),a0            ;41EE126E
  1028.     move.l    a6,-(sp)            ;2F0E
  1029.     move.l    ($0030,a6),a6            ;2C6E0030
  1030.     jsr    (_LVOObtainSemaphore,a6)    ;4EAEFDCC
  1031.  
  1032.     move.l    (sp)+,a6            ;2C5F
  1033.     lea    ($0082,a6),a2            ;45EE0082
  1034. .loop    bsr.b    cd_processwindow        ;614C
  1035.     move.l    (a2),a2                ;2452
  1036.     tst.l    (a2)                ;4A92
  1037.     bne.b    .loop                ;66F8
  1038.     lea    ($126E,a6),a0            ;41EE126E
  1039.     move.l    a6,-(sp)            ;2F0E
  1040.  
  1041.     move.l    ($0030,a6),a6            ;2C6E0030
  1042.     jsr    (_LVOReleaseSemaphore,a6)    ;4EAEFDC6
  1043.     move.l    (sp)+,a6            ;2C5F
  1044.     move.l    (sp)+,d7            ;2E1F
  1045.  
  1046.  
  1047.  
  1048.     ; graphics/WriteChunkyPixels() bug
  1049.     ; --------------------------------
  1050.  
  1051.     ; fixed
  1052.  
  1053.     movem.w    d0/d1,-(sp)        ;48A7C000    ;4    {xstart, ystart}
  1054.     movem.l    a0/a2/a6,-(sp)        ;48E700A2    ;8    {rp, array, gfxbase} ***mod! -2
  1055.     move.l    a0,a1            ;2248        ;a1 = rp
  1056.     pea    (writechunkypixels_hook,pc) ;487A0022    ;20    ***mod! offs + 2
  1057.     subq.l    #8,sp            ;518F        ;28    ***mod! - 2
  1058.     move.l    sp,a0            ;204F        ;a0 = hook
  1059.     movem.w    d0-d3,-(sp)        ;48A7F000    ;36   {xstart, ystart, xstop, ystop}
  1060.     move.l    sp,a2            ;244F        ;a2 = rect
  1061.     move.l    d4,-(sp)        ;2F04        ;40   bytesperrow
  1062.     move.l    (gb_LayersBase,a6),a6    ;2C6E01C8
  1063.     jsr    (_LVODoHookClipRects,a6);4EAEFF28
  1064.     lea    (36-8,sp),sp        ;4FEF001C
  1065.     movem.l    (sp)+,a2/a6        ;4CDF4400    ;***mod! + 2
  1066.     addq.l    #4,sp            ;588F        ;***mod! + 2
  1067.     rts                ;4E75
  1068. writechunkypixels_hook
  1069.  
  1070.  
  1071.     ; original (ROM 40.068_A1200)
  1072.  
  1073.     movem.w    d0/d1,-(sp)        ;48A7C000    ;4    {xstart, ystart}
  1074.     move.l    a6,-(sp)        ;2F0E        ;8    gfxbase
  1075.     move.l    a2,-(sp)        ;2F0A        ;12   array
  1076.     move.l    a0,-(sp)        ;2F08        ;16   rp
  1077.     move.l    a0,a1            ;2248        ;a1 = rp
  1078.     pea    (writechunkypixels_hook,pc) ;487A0020    ;20
  1079.     lea    (-8,sp),sp        ;4FEFFFF8    ;28
  1080.     move.l    sp,a0            ;204F        ;a0 = hook
  1081.     movem.w    d0-d3,-(sp)        ;48A7F000    ;36   {xstart, ystart, xstop, ystop}
  1082.     move.l    sp,a2            ;244F        ;a2 = rect
  1083.     move.l    d4,-(sp)        ;2F04        ;40   bytesperrow
  1084.     move.l    (gb_LayersBase,a6),a6    ;2C6E01C8
  1085.     jsr    (_LVODoHookClipRects,a6);4EAEFF28
  1086.     lea    (36,sp),sp        ;4FEF0024
  1087.     move.l    (sp)+,a6        ;2C5F
  1088.     rts                ;4E75
  1089. writechunkypixels_hook
  1090.  
  1091.     ; exec/FreePooled() bug
  1092.     ; ---------------------
  1093.  
  1094.     ; fixed (SetPatch)
  1095.  
  1096. _FreePooled    move.l    a0,d1        ;2208
  1097.     beq.b    .exit        ;675E
  1098.     move.l    a1,d1        ;2209
  1099.     beq.b    .exit        ;675A
  1100.     cmp.l    ($0014,a0),d0    ;B0A80014
  1101.     bcc.b    .big_free    ;6456
  1102.     move.l    a3,-(sp)    ;2F0B
  1103.     move.l    (a0),d1        ;2210
  1104. .findmem    move.l    d1,a3        ;2641
  1105.     move.l    (a3),d1        ;2213
  1106.     beq.b    .nomem        ;6762
  1107.     tst.l    (LN_TYPE,a3)    ;4AAB0008
  1108.     beq.b    .nomem        ;675C
  1109.     cmp.l    (MH_LOWER,a3),a1 ;B3EB0014
  1110.     bcs.b    .findmem    ;65EE
  1111.     cmp.l    (MH_UPPER,a3),a1 ;B3EB0018
  1112.     bcc.b    .findmem    ;64E8
  1113.     move.l    a3,a0        ;204B
  1114.     jsr    (_LVODeallocate,a6) ;4EAEFF40
  1115.     move.l    (LN_PRED,a3),a1    ;226B0004
  1116.     move.l    (LN_PRED,a1),d1    ;22290004
  1117.     beq.b    .nope        ;6716
  1118.     move.l    d1,a0        ;2041
  1119.     move.l    a3,(a0)        ;208B
  1120.     move.l    a0,(LN_PRED,a3)    ;27480004
  1121.     move.l    a3,(LN_PRED,a1)    ;234B0004
  1122.     move.l    (a3),a0        ;2053
  1123.     move.l    a0,(a1)        ;2288
  1124.     move.l    a1,(LN_PRED,a0)    ;21490004
  1125.     move.l    a1,(a3)        ;2689
  1126. .nope    move.l    a3,a1        ;224B
  1127.     move.l    (sp)+,a3    ;265F
  1128.     move.l    (MH_FREE,a1),d0    ;2029001C    ** fixed **
  1129.     add.l    (MH_LOWER,a1),d0 ;D0A90014
  1130.     sub.l    (MH_UPPER,a1),d0 ;90A90018
  1131.     beq.b    .free        ;6706
  1132. .exit    rts            ;4E75
  1133.  
  1134. .big_free    subq.l    #4,a1        ;5989
  1135.     subq.l    #8,a1        ;5189
  1136. .free    move.l    a1,d0        ;2009
  1137.     move.l    (a1)+,a0    ;2059
  1138.     move.l    (a1),a1        ;2251
  1139.     move.l    a0,(a1)        ;2288
  1140.     move.l    a1,(4,a0)    ;21490004
  1141.     move.l    d0,a1        ;2240
  1142.     jmp    (_LVOFreeVec,a6) ;4EEEFD4E
  1143.  
  1144. .nomem    move.l    (sp)+,a3    ;265F
  1145.     move.l    d7,-(sp)    ;2F07
  1146.     move.l    #$0100000F,d7    ;2E3C0100000F
  1147.     jsr    (_LVOAlert,a6)    ;4EAEFF94
  1148.     move.l    (sp)+,d7    ;2E1F
  1149.     rts            ;4E75
  1150.  
  1151.  
  1152.     ; original (ROM39.106_A1200)
  1153.  
  1154. _LVOFreePooled    move.l    a0,d1        ;2208
  1155.     beq.b    .exit        ;675E
  1156.     move.l    a1,d1        ;2209
  1157.     beq.b    .exit        ;675A
  1158.     cmp.l    ($0014,a0),d0    ;B0A80014
  1159.     bcc.b    .big_free    ;6456
  1160.     move.l    a3,-(sp)    ;2F0B
  1161.     move.l    (a0),d1        ;2210
  1162. .findmem    move.l    d1,a3        ;2641
  1163.     move.l    (a3),d1        ;2213
  1164.     beq.b    .nomem        ;6762
  1165.     tst.l    (LN_TYPE,a3)    ;4AAB0008
  1166.     beq.b    .nomem        ;675C
  1167.     cmp.l    (MH_LOWER,a3),a1 ;B3EB0014
  1168.     bcs.b    .findmem    ;65EE
  1169.     cmp.l    (MH_UPPER,a3),a1 ;B3EB0018
  1170.     bcc.b    .findmem    ;64E8
  1171.     move.l    a3,a0        ;204B
  1172.     bsr.w    _LVODeallocate    ;6100F996
  1173.     move.l    (LN_PRED,a3),a1    ;226B0004
  1174.     move.l    (LN_PRED,a1),d1    ;22290004
  1175.     beq.b    .nope        ;6716
  1176.     move.l    d1,a0        ;2041
  1177.     move.l    a3,(a0)        ;208B
  1178.     move.l    a0,(LN_PRED,a3)    ;27480004
  1179.     move.l    a3,(LN_PRED,a1)    ;234B0004
  1180.     move.l    (a3),a0        ;2053
  1181.     move.l    a0,(a1)        ;2288
  1182.     move.l    a1,(LN_PRED,a0)    ;21490004
  1183.     move.l    a1,(a3)        ;2689
  1184. .nope    move.l    a3,a1        ;224B
  1185.     move.l    (sp)+,a3    ;265F
  1186.     move.l    (MH_SIZE,a1),d0    ;20290020    ** bug, should be MH_FREE **
  1187.     add.l    (MH_LOWER,a1),d0 ;D0A90014
  1188.     sub.l    (MH_UPPER,a1),d0 ;90A90018
  1189.     beq.b    .free        ;6706
  1190. .exit    rts            ;4E75
  1191.  
  1192. .big_free    subq.l    #4,a1        ;5989
  1193.     subq.l    #8,a1        ;5189
  1194. .free    move.l    a1,d0        ;2009
  1195.     move.l    (a1)+,a0    ;2059
  1196.     move.l    (a1),a1        ;2251
  1197.     move.l    a0,(a1)        ;2288
  1198.     move.l    a1,(4,a0)    ;21490004
  1199.     move.l    d0,a1        ;2240
  1200.     jmp    (_LVOFreeVec,a6) ;4EEEFD4E
  1201.  
  1202. .nomem    move.l    (sp)+,a3    ;265F
  1203.     move.l    d7,-(sp)    ;2F07
  1204.     move.l    #$0100000F,d7    ;2E3C0100000F
  1205.     jsr    (_LVOAlert,a6)    ;4EAEFF94
  1206.     move.l    (sp)+,d7    ;2E1F
  1207.     rts            ;4E75
  1208.  
  1209.  
  1210.     ; graphics/WritePuxelArray8 & WritePixelLine8 bug
  1211.     ; -----------------------------------------------
  1212.  
  1213.     ; fixed
  1214.  
  1215.  
  1216.     include    "exec/libraries.i"
  1217.     include    "graphics/gfx.i"
  1218.     include    "graphics/rastport.i"
  1219.     include    "graphics/graphics_lib.i"
  1220.  
  1221. WritePixelArray8
  1222.     movem.l    d2-d7/a2-a4,-(sp) ;48E73F38
  1223.     sub.w    d0,d2        ;9440
  1224.     ext.l    d2        ;48C2
  1225.     addq.l    #1,d2        ;5282
  1226.     move.l    d2,d4        ;2802
  1227.     add.w    #15,d4        ;D87C000F        addi.w    #15,d4        ;0644000F
  1228.     moveq    #-1,d6        ;7CFF
  1229.     and.w    #-16,d4        ;C87CFFF0        andi.w    #-16,d4        ;0244FFF0
  1230.     ble.b    .exit2        ;6F2A
  1231.     move.l    d0,d7        ;2E00
  1232.     move.l    d1,d5        ;2A01
  1233.     sub.w    d1,d3        ;9641
  1234.     ext.l    d3        ;48C3
  1235.     addq.l    #1,d3        ;5283
  1236.     ble.b    .exit2        ;6F1E
  1237.     moveq    #0,d6        ;7C00
  1238.     move.l    a0,a3        ;2648
  1239.     move.l    a1,a4        ;2849
  1240.  
  1241. .dolines    move.l    a3,a0        ;204B
  1242.     move.l    d7,d0        ;2007
  1243.     move.l    d5,d1        ;2205
  1244.     move.l    a4,a1        ;224C
  1245.     bsr.b    _writepixelline8 ;6122
  1246.     addq.l    #1,d5        ;5285
  1247.     add.l    d4,a2        ;D5C4
  1248.     add.l    d0,d6        ;DC80
  1249.     subq.l    #1,d3        ;5383
  1250.     bne.b    .dolines    ;66EC
  1251.  
  1252.     jsr    (_LVOWaitBlit,a6) ;4EAEFF1C
  1253. .exit2    move.l    d6,d0        ;2006
  1254. .exit    movem.l    (sp)+,d2-d7/a2-a4 ;4CDF1CFC
  1255.     rts            ;4E75
  1256.  
  1257.     dc.w    $4E71,$4E71,$4E71,$4E71
  1258. WritePixelLine8
  1259.     move.l    (_LVOWaitBlit+2,a6),-(sp) ;2F2EFF1E    + 4
  1260.  
  1261. _writepixelline8
  1262.     movem.l    d0-d7/a0-a5,-(sp) ;48E7FFFC
  1263.  
  1264.     ext.l    d2        ;48C2
  1265.     add.w    #15,d2        ;D47C000F        addi.w    #15,d2        ;0642000F
  1266.     and.w    #-16,d2        ;C47CFFF0        andi.w    #-16,d2        ;0242FFF0
  1267.     moveq    #16,d1        ;7210
  1268.     move.l    d2,d4        ;2802
  1269.     jsr    (_LVOWaitBlit,a6) ;4EAEFF1C
  1270.  
  1271. .oloop    move.l    (9*4,sp),a0    ;206F0024        a1 (temprp) from stack
  1272.     move.l    d4,d3        ;2604
  1273.     move.l    (rp_BitMap,a0),a0 ;20680004        move.l    (rp_BitMap,a1),a3 ;26690004
  1274.     sub.l    d2,d3        ;9682
  1275.     move.b    (bm_Depth,a0),d0 ;1028 0005        move.b    (bm_Depth,a3),d0 ;102B0005
  1276.     lea    (a2,d3.l),a3    ;47F23800
  1277.     addq.l    #bm_Planes,a0    ;5088            lea    (bm_Planes,a3),a0 ;41EB0008
  1278.     lsr.l    #3,d3        ;E68B
  1279.     movem.l    (a3)+,d6/d7/a4/a5 ;4CDB30C0
  1280.  
  1281. .iloop    move.l    (a0)+,a1    ;2258
  1282.     moveq    #0,d5        ;7A00
  1283.     add.l    d3,a1        ;D3C3            lea    (a1,d3.l),a1    ;43F13800
  1284.     move.b    -(a3),d5    ;1A23
  1285.     ror.l    #1,d5        ;E29D
  1286.     move.b    d5,(a3)        ;1685
  1287.     move.b    -(a3),d5    ;1A23
  1288.     ror.l    #1,d5        ;E29D
  1289.     move.b    d5,(a3)        ;1685
  1290.     move.b    -(a3),d5    ;1A23
  1291.     ror.l    #1,d5        ;E29D
  1292.     move.b    d5,(a3)        ;1685
  1293.     move.b    -(a3),d5    ;1A23
  1294.     ror.l    #1,d5        ;E29D
  1295.     move.b    d5,(a3)        ;1685
  1296.     move.b    -(a3),d5    ;1A23
  1297.     ror.l    #1,d5        ;E29D
  1298.     move.b    d5,(a3)        ;1685
  1299.     move.b    -(a3),d5    ;1A23
  1300.     ror.l    #1,d5        ;E29D
  1301.     move.b    d5,(a3)        ;1685
  1302.     move.b    -(a3),d5    ;1A23
  1303.     ror.l    #1,d5        ;E29D
  1304.     move.b    d5,(a3)        ;1685
  1305.     move.b    -(a3),d5    ;1A23
  1306.     ror.l    #1,d5        ;E29D
  1307.     move.b    d5,(a3)        ;1685
  1308.     move.b    -(a3),d5    ;1A23
  1309.     ror.l    #1,d5        ;E29D
  1310.     move.b    d5,(a3)        ;1685
  1311.     move.b    -(a3),d5    ;1A23
  1312.     ror.l    #1,d5        ;E29D
  1313.     move.b    d5,(a3)        ;1685
  1314.     move.b    -(a3),d5    ;1A23
  1315.     ror.l    #1,d5        ;E29D
  1316.     move.b    d5,(a3)        ;1685
  1317.     move.b    -(a3),d5    ;1A23
  1318.     ror.l    #1,d5        ;E29D
  1319.     move.b    d5,(a3)        ;1685
  1320.     move.b    -(a3),d5    ;1A23
  1321.     ror.l    #1,d5        ;E29D
  1322.     move.b    d5,(a3)        ;1685
  1323.     move.b    -(a3),d5    ;1A23
  1324.     ror.l    #1,d5        ;E29D
  1325.     move.b    d5,(a3)        ;1685
  1326.     move.b    -(a3),d5    ;1A23
  1327.     ror.l    #1,d5        ;E29D
  1328.     move.b    d5,(a3)        ;1685
  1329.     move.b    -(a3),d5    ;1A23
  1330.     ror.l    #1,d5        ;E29D
  1331.     move.b    d5,(a3)        ;1685
  1332.     rol.l    d1,d5        ;E3BD
  1333.     add.l    d1,a3        ;D7C1
  1334.     move.w    d5,(a1)+    ;32C5
  1335.     subq.b    #1,d0        ;5300
  1336.     bne.b    .iloop        ;668E
  1337.  
  1338.     movem.l    d6/d7/a4/a5,(-16,a3) ;48EB30C0FFF0
  1339.  
  1340.     sub.l    d1,d2        ;9481
  1341.     bgt    .oloop        ;6E00FF76
  1342.  
  1343.     moveq    #0,d0        ;7000
  1344.     lea    (8*4,sp),a0    ;41EF0020    ; a0 & a1 from stack
  1345.     moveq    #0,d1        ;7200
  1346.     movem.l    (sp),d2-d4    ;4CD7001C
  1347.     move.l    (a0)+,a1    ;2258        ; a1 = rp
  1348.     moveq    #1,d5        ;7A01
  1349.     moveq    #-$40,d6    ;7CC0        ; d6 = $ffffffc0
  1350.     move.l    (a0),a0        ;2050        ; a0 = temprp
  1351.     jsr    (_LVOClipBlit,a6) ;4EAEFDD8
  1352.  
  1353.     movem.l    (sp)+,d0-d7/a0-a5 ;4CDF3FFF
  1354.     move.l    d2,d0        ;2002
  1355.     rts            ;4E75
  1356.  
  1357.  
  1358.     ; original (ROM 40.068_A1200)
  1359.  
  1360.     include    "exec/libraries.i"
  1361.     include    "graphics/gfx.i"
  1362.     include    "graphics/rastport.i"
  1363.     include    "graphics/graphics_lib.i"
  1364.  
  1365. __LVOWritePixelArray8
  1366.     movem.l    d2-d7/a2-a4,-(sp) ;48E73F38
  1367.     sub.w    d0,d2        ;9440
  1368.     ext.l    d2        ;48C2
  1369.     addq.l    #1,d2        ;5282
  1370.     move.l    d2,d4        ;2802
  1371.     add.w    #15,d4        ;D87C000F
  1372.     and.w    #$FFF0,d4    ;C87CFFF0
  1373.     ble.b    .error        ;6F34
  1374.     move.l    d0,d7        ;2E00
  1375.     move.l    d1,d5        ;2A01
  1376.     sub.w    d1,d3        ;9641
  1377.     ext.l    d3        ;48C3
  1378.     addq.l    #1,d3        ;5283
  1379.     ble.b    .error        ;6F28
  1380.     move.l    a0,a3        ;2648
  1381.     move.l    a1,a4        ;2849
  1382.     moveq    #0,d6        ;7C00
  1383.     bra.b    .goloop        ;6014
  1384.  
  1385. .dolines    move.l    a3,a0        ;204B
  1386.     move.l    d7,d0        ;2007
  1387.     move.l    d5,d1        ;2205
  1388.     move.l    a4,a1        ;224C
  1389.     jsr    (__LVOWritePixelLine8).l ;4EB900F85F3A
  1390.     addq.l    #1,d5        ;5285
  1391.     add.l    d4,a2        ;D5C4
  1392.     add.l    d0,d6        ;DC80
  1393. .goloop    dbra    d3,.dolines    ;51CBFFEA
  1394.     move.l    d6,d0        ;2006
  1395.     movem.l    (sp)+,d2-d7/a2-a4 ;4CDF1CFC
  1396.     rts            ;4E75
  1397.  
  1398. .error    moveq    #-1,d0        ;70FF
  1399.     movem.l    (sp)+,d2-d7/a2-a4 ;4CDF1CFC
  1400.     rts            ;4E75
  1401.  
  1402. __LVOWritePixelLine8
  1403.     movem.l    d0-d7/a0-a5,-(sp) ;48E7FFFC
  1404.     move.l    (rp_BitMap,a1),a3 ;26690004
  1405.     moveq    #0,d1        ;7200
  1406.     move.b    (bm_Depth,a3),d1 ;122B0005
  1407.     lsl.w    #2,d1        ;E549
  1408.     lea    (bm_Planes,a3),a0 ;41EB0008
  1409.     ext.l    d2        ;48C2
  1410.     add.w    #15,d2        ;D47C000F
  1411.     and.w    #-16,d2        ;C47CFFF0
  1412.     move.l    d2,d4        ;2802
  1413. .oloop    move.l    d4,d3        ;2604
  1414.     sub.l    d2,d3        ;9682
  1415.     lea    (16,a2,d3.l),a3 ;47F23810
  1416.     lsr.l    #3,d3        ;E68B
  1417.     move.l    (a3),d6        ;2C13
  1418.     move.l    (4,a3),d7    ;2E2B0004
  1419.     move.l    (8,a3),a4    ;286B0008
  1420.     move.l    (12,a3),a5    ;2A6B000C
  1421.     moveq    #0,d0        ;7000
  1422. .iloop    move.l    (a0,d0.w),a1    ;22700000
  1423.     lea    (a1,d3.l),a1    ;43F13800
  1424.     moveq    #0,d5        ;7A00
  1425.     move.b    -(a3),d5    ;1A23
  1426.     ror.l    #1,d5        ;E29D
  1427.     move.b    d5,(a3)        ;1685
  1428.     move.b    -(a3),d5    ;1A23
  1429.     ror.l    #1,d5        ;E29D
  1430.     move.b    d5,(a3)        ;1685
  1431.     move.b    -(a3),d5    ;1A23
  1432.     ror.l    #1,d5        ;E29D
  1433.     move.b    d5,(a3)        ;1685
  1434.     move.b    -(a3),d5    ;1A23
  1435.     ror.l    #1,d5        ;E29D
  1436.     move.b    d5,(a3)        ;1685
  1437.     move.b    -(a3),d5    ;1A23
  1438.     ror.l    #1,d5        ;E29D
  1439.     move.b    d5,(a3)        ;1685
  1440.     move.b    -(a3),d5    ;1A23
  1441.     ror.l    #1,d5        ;E29D
  1442.     move.b    d5,(a3)        ;1685
  1443.     move.b    -(a3),d5    ;1A23
  1444.     ror.l    #1,d5        ;E29D
  1445.     move.b    d5,(a3)        ;1685
  1446.     move.b    -(a3),d5    ;1A23
  1447.     ror.l    #1,d5        ;E29D
  1448.     move.b    d5,(a3)        ;1685
  1449.     move.b    -(a3),d5    ;1A23
  1450.     ror.l    #1,d5        ;E29D
  1451.     move.b    d5,(a3)        ;1685
  1452.     move.b    -(a3),d5    ;1A23
  1453.     ror.l    #1,d5        ;E29D
  1454.     move.b    d5,(a3)        ;1685
  1455.     move.b    -(a3),d5    ;1A23
  1456.     ror.l    #1,d5        ;E29D
  1457.     move.b    d5,(a3)        ;1685
  1458.     move.b    -(a3),d5    ;1A23
  1459.     ror.l    #1,d5        ;E29D
  1460.     move.b    d5,(a3)        ;1685
  1461.     move.b    -(a3),d5    ;1A23
  1462.     ror.l    #1,d5        ;E29D
  1463.     move.b    d5,(a3)        ;1685
  1464.     move.b    -(a3),d5    ;1A23
  1465.     ror.l    #1,d5        ;E29D
  1466.     move.b    d5,(a3)        ;1685
  1467.     move.b    -(a3),d5    ;1A23
  1468.     ror.l    #1,d5        ;E29D
  1469.     move.b    d5,(a3)        ;1685
  1470.     move.b    -(a3),d5    ;1A23
  1471.     ror.l    #1,d5        ;E29D
  1472.     move.b    d5,(a3)        ;1685
  1473.     lea    (16,a3),a3    ;47EB0010
  1474.     swap    d5        ;4845
  1475.     move.w    d5,(a1)+    ;32C5
  1476.     addq.b    #4,d0        ;5800
  1477.     cmp.b    d0,d1        ;B200
  1478.     bgt.b    .iloop        ;6E88
  1479.     move.l    d6,(a3)        ;2686
  1480.     move.l    d7,(4,a3)    ;27470004
  1481.     move.l    a4,(8,a3)    ;274C0008
  1482.     move.l    a5,(12,a3)    ;274D000C
  1483.     subq.l    #8,d2        ;5182
  1484.     subq.l    #8,d2        ;5182
  1485.     bgt.w    .oloop        ;6E00FF5A
  1486.     moveq    #0,d0        ;7000
  1487.     moveq    #0,d1        ;7200
  1488.     movem.l    (sp),d2-d4    ;4CD7001C
  1489.     moveq    #1,d5        ;7A01
  1490.     moveq    #3,d6        ;7C03
  1491.     rol.l    #6,d6        ;ED9E
  1492.     movem.l    (32,sp),a0/a1    ;4CEF03000020
  1493.     exg    a0,a1        ;C149
  1494.     jsr    (_LVOClipBlit,a6) ;4EAEFDD8
  1495.     jsr    (_LVOWaitBlit,a6) ;4EAEFF1C
  1496.     movem.l    (sp)+,d0-d7/a0-a5 ;4CDF3FFF
  1497.     move.l    d2,d0        ;2002
  1498.     rts            ;4E75
  1499.  
  1500.  
  1501.  
  1502.     ; exec/ReleaseSemaphore bug
  1503.     ; -------------------------
  1504.  
  1505.     ; fixed
  1506.  
  1507. .mloop    move.l    a2,($0014,a1)    ;234A0014
  1508.     addq.w    #1,(14,a2)    ;526A000E
  1509.     jsr    (_LVOReplyMsg,a6) ;4EAEFE86
  1510.     move.l    ($0028,a2),d1    ;222A0028
  1511. .iloop    move.l    (a3),d0        ;2013
  1512.     beq.b    lbC002E44    ;67DA
  1513.     move.l    a3,a1        ;224B
  1514.     move.l    d0,a3        ;2640
  1515.     move.l    (8,a1),d0    ;20290008
  1516.     beq.b    .nuller        ;6712
  1517.     cmp.l    d0,d1        ;B280
  1518.     bne.b    .iloop        ;66EE
  1519.     move.l    (4,a1),a0    ;20690004
  1520.     move.l    a3,(a0)        ;208B
  1521.     move.l    a0,(4,a3)    ;27480004
  1522.     move.l    d1,a1        ;2241
  1523.     bra.b    lbC002E3A    ;60B4
  1524.  
  1525. .nuller    cmp.l    ($0014,a1),d1    ;B2A90014
  1526.     bne.b    .iloop        ;66DA
  1527.     move.l    (4,a1),a0    ;20690004
  1528.     move.l    a3,(a0)        ;208B
  1529.     move.l    a0,(4,a3)    ;27480004
  1530.     bra.b    .mloop        ;60B6
  1531.  
  1532.  
  1533.     ; original (ROM 39.106_A1200)
  1534.  
  1535. .mloop    move.l    a2,($0014,a1)    ;234A0014
  1536.     addq.w    #1,(14,a2)    ;526A000E
  1537.     jsr    (_LVOReplyMsg,a6) ;4EAEFE86
  1538.     move.l    ($0028,a2),d1    ;222A0028
  1539. .iloop    move.l    (a3),d0        ;2013
  1540.     beq.b    lbC002E44    ;67DA
  1541.     move.l    a3,a1        ;224B
  1542.     move.l    d0,a3        ;2640
  1543.     move.l    (8,a1),d0    ;20290008
  1544.     beq.b    .nuller        ;6712
  1545.     cmp.l    d0,d1        ;B280
  1546.     bne.b    .iloop        ;66EE
  1547.     move.l    (4,a1),a0    ;20690004
  1548.     move.l    a3,(a0)        ;208B
  1549.     move.l    a0,(4,a3)    ;27480004
  1550.     move.l    d1,a1        ;2241
  1551.     bra.b    lbC002E3A    ;60B4
  1552.  
  1553. .nuller    cmp.l    ($0014,a1),d1    ;B2A90014
  1554.     bne.b    .iloop        ;66DA
  1555.     move.l    (4,a1),a0    ;20690004
  1556.     move.l    a3,(a0)        ;208B
  1557.     move.l    a0,(4,a3)    ;27480004
  1558.     addq.w    #1,(14,a2)    ;526A000E
  1559.     bra.b    .mloop        ;60BA
  1560.  
  1561.  
  1562.     ; utility/UMult64 bug
  1563.     ; -------------------
  1564.  
  1565.     ; fixed
  1566.  
  1567. _LVOUMult64    movem.l    d2-d4,-(sp)    ;48E73800
  1568.     move.l    d1,d3        ;2601
  1569.     mulu    d0,d3        ;C6C0
  1570.     move.l    d1,d2        ;2401
  1571.     swap    d2        ;4842
  1572.     swap    d0        ;4840
  1573.     mulu    d0,d2        ;C4C0
  1574.     swap    d3        ;4843
  1575.     move.l    d1,d4        ;2801
  1576.     mulu    d0,d4        ;C8C0
  1577.     add.w    d4,d3        ;D644
  1578.     clr.w    d4        ;4244
  1579.     swap    d4        ;4844
  1580.     addx.l    d4,d2        ;D584
  1581.     swap    d0        ;4840
  1582.     swap    d1        ;4841
  1583.     move.l    d1,d4        ;2801
  1584.     mulu    d0,d4        ;C8C0
  1585.     add.w    d4,d3        ;D644
  1586.     clr.w    d4        ;4244
  1587.     swap    d4        ;4844
  1588.     addx.l    d4,d2        ;D584
  1589.     swap    d3        ;4843
  1590.     move.l    d2,d0        ;2202        ; ***
  1591.     move.l    d3,d1        ;2003        ; ***
  1592.     movem.l    (sp)+,d2-d4    ;4CDF001C
  1593.     rts            ;4E75
  1594.  
  1595.  
  1596.     ; original (ROM 39.106_A1200)
  1597.  
  1598. _LVOUMult64    movem.l    d2-d4,-(sp)    ;48E73800
  1599.     move.l    d1,d3        ;2601
  1600.     mulu    d0,d3        ;C6C0
  1601.     move.l    d1,d2        ;2401
  1602.     swap    d2        ;4842
  1603.     swap    d0        ;4840
  1604.     mulu    d0,d2        ;C4C0
  1605.     swap    d3        ;4843
  1606.     move.l    d1,d4        ;2801
  1607.     mulu    d0,d4        ;C8C0
  1608.     add.w    d4,d3        ;D644
  1609.     clr.w    d4        ;4244
  1610.     swap    d4        ;4844
  1611.     addx.l    d4,d2        ;D584
  1612.     swap    d0        ;4840
  1613.     swap    d1        ;4841
  1614.     move.l    d1,d4        ;2801
  1615.     mulu    d0,d4        ;C8C0
  1616.     add.w    d4,d3        ;D644
  1617.     clr.w    d4        ;4244
  1618.     swap    d4        ;4844
  1619.     addx.l    d4,d2        ;D584
  1620.     swap    d3        ;4843
  1621.     move.l    d2,d0        ;2002
  1622.     move.l    d3,d1        ;2203
  1623.     movem.l    (sp)+,d2-d4    ;4CDF001C
  1624.     rts            ;4E75
  1625.  
  1626.  
  1627.  
  1628.  
  1629.     ; A4000 scsi.device initcode bug
  1630.     ; ------------------------------
  1631.  
  1632.     ; fixed
  1633.  
  1634. scsi_initcode    movem.l    d2-d7/a2-a5,-(sp)    ;48E73F3C
  1635.     moveq    #0,d6            ;7C00
  1636.  
  1637.     clr.l    -(sp)            ;42A7        null by default
  1638.     lea    (-$40,sp),sp        ;4FEFFFC0
  1639.     move.l    sp,a5            ;2A4F
  1640.  
  1641.     lea    (battmemname,pc),a1    ;43FAxxxx    try to open battmem.resource
  1642.     jsr    (_LVOOpenResource,a6)    ;4EAEFE0E
  1643.     tst.l    d0            ;4A80
  1644.     beq.b    .nobattres        ;6708
  1645.     move.l    a6,(a5)            ;2A8E        read the 2nd drive flag
  1646.     move.l    d0,a6            ;2C40
  1647.     bsr.w    read_battmem        ;6100xxxx
  1648. .nobattres
  1649.     lea    ($00DD2020),a4        ;49F900DD2020
  1650.     moveq    #0,d0            ;7000
  1651.     bsr.w    scsi_probescsi        ;6100xxxx
  1652.     lea    ($44,sp),sp        ;4FEF0044    release stack storage
  1653. ;;    tst.l    d0            ;4A80
  1654.     beq.w    .exitnull        ;6700xxxx
  1655.  
  1656.     move.l    (ThisTask,a6),d5    ;2A2E0114
  1657.  
  1658.     moveq    #6,d0            ;7006
  1659.     jsr    (_LVOexecPrivate14,a6)    ;4EAEFCD6
  1660.  
  1661.     move.l    d0,a6            ;2C40
  1662.     jsr    (_LVAllocConfigDev,a6)    ;4EAEFFD0
  1663.     move.l    (4).l,a6        ;2C780004
  1664.  
  1665.  
  1666.     ; original (ROM 40.68_A4000)
  1667.  
  1668. scsi_initcode    movem.l    d2-d7/a2-a5,-(sp)    ;48E73F3C
  1669.     sub.l    a1,a1            ;93C9
  1670.     jsr    (_LVOFindTask,a6)    ;4EAEFEDA
  1671.     move.l    d0,d5            ;2A00
  1672.  
  1673.     moveq    #6,d0            ;7006
  1674.     jsr    (_LVOexecPrivate14,a6)    ;4EAEFCD6
  1675.     tst.l    d0            ;4A80
  1676.     bne.b    .got            ;660E
  1677.     move.l    #$14030000,d7        ;2E3C14030000
  1678.     jsr    (_LVOAlert,a6)        ;4EAEFF94
  1679.     bra.w    .exitnull        ;6000012E
  1680. .got
  1681.     moveq    #0,d6            ;7C00
  1682.     lea    ($00DD2020),a4        ;49F900DD2020
  1683.     move.l    d0,-(sp)        ;2F00
  1684.     moveq    #0,d0            ;7000
  1685.     bsr.w    scsi_probescsi        ;61002102
  1686.     move.l    d0,d1            ;2200
  1687.     move.l    (sp)+,d0        ;201F
  1688.     tst.l    d1            ;4A81
  1689.     beq.w    .exitnull        ;67000114
  1690.  
  1691.     move.l    d0,a6            ;2C40         34
  1692.     jsr    (_LVAllocConfigDev,a6)    ;4EAEFFD0
  1693.     move.l    (4).l,a6        ;2C7900000004
  1694.  
  1695.  
  1696.     ; exec/CheckIO() BOOL return code "bug"
  1697.     ; -------------------------------------
  1698.  
  1699. ; - exec/CheckIO BOOL return code fix. SetPatch has a workaround for this,
  1700. ;   but again better have this fixed in ROM already.
  1701. ;  (this one is disable because of potential compatibility problems)
  1702.  
  1703.     ; fixed
  1704.  
  1705. _LVOCheckIO    btst    #IOB_QUICK,(IO_FLAGS,a1);08290000001E
  1706.     bne.b    .ready            ;660C
  1707.     cmp.b    #NT_REPLYMSG,(MN+LN_TYPE,a1) ;0C2900070008
  1708.     beq.b    .ready            ;6704
  1709.     moveq    #0,d0            ;7000
  1710.     rts                ;4E75
  1711. .ready    moveq    #1,d0            ;7001
  1712.     rts                ;4E75
  1713.  
  1714.  
  1715.     ; original (ROM 39.106_A1200)
  1716.  
  1717. _LVOCheckIO    btst    #IOB_QUICK,(IO_FLAGS,a1);08290000001E
  1718.     bne.b    .ready            ;660C
  1719.     cmp.b    #NT_REPLYMSG,(MN+LN_TYPE,a1) ;0C2900070008
  1720.     beq.b    .ready            ;6704
  1721.     moveq    #0,d0            ;7000
  1722.     rts                ;4E75
  1723. .ready    move.l    a1,d0            ;2009
  1724.     rts                ;4E75
  1725.  
  1726.  
  1727.     ; graphics/InitArea() bug
  1728.     ; -----------------------
  1729.  
  1730.     ; fixed
  1731. _LVOInitArea
  1732.     move.l    a1,(a0)+        ; 2 ai_VctrTbl
  1733.     mulu.w    #4,d0            ; 4 get ptr to    note: mulu.w fill whole longword!
  1734.     move.l    a1,(a0)+        ; 2 ai_VctrPtr
  1735.     adda.l    d0,a1            ; 2 FlagTbl
  1736.     lsr.l    #2,d0            ; 2 get original count
  1737.     move.l    a1,(a0)+        ; 2 ai_FlagTbl
  1738.     move.l    a1,(a0)+        ; 2 ai_FlagPtr
  1739.     move.l    d0,(a0)            ; 2 ai_Count (=0) & ai_MaxCount
  1740.     bra.b    .goclr            ; 2 clear the FlagTbl
  1741. .clr    clr.b    (a1)+            ; 2
  1742. .goclr    dbf    d0,.clr            ; 4
  1743.     rts                ; 2 = 28
  1744.  
  1745.     ;original (ROM 40.68_A1200), graphics 40.24:
  1746. _LVOInitArea
  1747.     move.l    a1,(ai_VctrPtr,a0)    ; 4
  1748.     move.l    a1,(a0)            ; 2 ai_VctrTbl
  1749.     move.w    d0,(ai_MaxCount,a0)    ; 4 
  1750.     asl.w    #2,d0            ; 2 get ptr to    note: because of below, limit d0 to 8191
  1751.     adda.w    d0,a1            ; 2 GlagTbl    note: adda.w is signed, limit d0 to <32768
  1752.     move.l    a1,(ai_FlagPtr,a0)    ; 4 
  1753.     move.l    a1,(ai_FlagTbl,a0)    ; 4 
  1754.     clr.w    (ai_Count,a0)        ; 4 
  1755.     rts                ; 2 = 28
  1756.  
  1757.     ENDC
  1758.